define(
		[ "ng", "coordinador/js/coordinador-module", "common/js/user-module",
				"common/js/util-module", "common/js/colegio-info-module","ui.router" ],
		function(angular) {
			var app = angular.module("CoordinadorApp", [ 'UserModule', 'UtilModule',
					'CoordinadorModule', "ColegioInfoModule", "ui.router" ]);

			app.constant("OpcionesAdmin", [ {
				name : "admin.estudiantes",
				displayName : "Estudiantes",
				config : {
					url : '/estudiantes',
					templateUrl : '/coordinador/admin-estudiantes.html',
					controller : 'AdminEstudiantesCtrl'
				}
			}, {
				name : "admin.calendario",
				displayName : "Calendario académico",
				config : {
					url : '/calendario',
					templateUrl : '/coordinador/admin-calendario.html',
					controller : 'AdminCalendarioCtrl'
				}
			}, {
				name : "admin.cursos",
				displayName : "Cursos",
				config : {
					url : '/cursos',
					templateUrl : '/coordinador/admin-cursos.html',
					controller : 'AdminCursosCtrl'
				}
			}, ]);

			app.constant("OpcionesUsers", [ {
				name : "users.secretarios",
				displayName : "Secretarios",
				config : {
					url : '/secretarios',
					templateUrl : '/coordinador/users-users.html',
					controller : 'UsersUsersCtrl'
				}
			}, {
				name : "users.profesores",
				displayName : "Profesores",
				config : {
					url : '/profesores',
					templateUrl : '/coordinador/users-users.html',
					controller : 'UsersUsersCtrl'
				}
			} ]);

			app.config(function($stateProvider, $urlRouterProvider, OpcionesAdmin,
					OpcionesUsers) {
				$urlRouterProvider.otherwise("/admin");
				$stateProvider.state("admin", {
					url : '/admin',
					templateUrl : '/coordinador/admin.html',
					controller : 'AdminCtrl'
				});

				$stateProvider.state("users", {
					url : '/users',
					templateUrl : '/coordinador/users.html',
					controller : 'UsersCtrl'
				});

				$stateProvider.state("admin.curso", {
					url : '/cursos/:idCurso',
					templateUrl : '/coordinador/curso.html',
					controller : 'AdminCursoCtrl'
				});

				$stateProvider.state("admin.matricula", {
					url : '/admin/estudiante/:idEstudiante',
					templateUrl : '/coordinador/matricula.html',
					controller : 'AdminMatriculaCtrl'
				});

				$stateProvider.state("test", {
					url : "/test",
					templateUrl : "/coordinador/test.html",
					controller : "TestCtrl"
				});

				_.each(OpcionesAdmin, function(state) {
					$stateProvider.state(state.name, state.config);
				});
				_.each(OpcionesUsers, function(state) {
					$stateProvider.state(state.name, state.config);
				});

			});
			app.controller("CoordinadorCtrl", function($scope, User, $window, $state,
					Coordinador) {
				$scope.goNext = function() {
					var mensajes = Coordinador.goNext({}, {}, function() {
						console.log(mensajes);
					});

				}
				$scope.user = User.getMyInfo();
				$scope.isState = function(state) {
					return $state.includes(state);
				}
				$scope.logOut = function() {
					User.logout({}, function() {
						$window.location.href = "/";
					}, function() {
						$window.location.href = "/";
					})
				};
			});

			app.controller("AdminCtrl", function($scope, OpcionesAdmin) {

				$scope.opciones = OpcionesAdmin;

			});

			app.controller("UsersCtrl", function($scope, OpcionesUsers) {
				$scope.opciones = OpcionesUsers;
			});

			app.controller("AdminEstudiantesCtrl", function($scope, Coordinador,
					epModal, epLoading, epChanging, $window, ColegioInfo) {
				$scope.nuevaPersona = {};
				$scope.nuevoAcudiente = {};
				$scope.resultados = Coordinador.getEstudiantes({
					query : "Koot"
				});
				$scope.filter = function() {
					epChanging($scope, 500, function() {
						if ($scope.search.length > 0)
							$scope.resultados = Coordinador.getEstudiantes({
								query : $scope.search
							});
					});
				};
				$scope.crearEstudiante = function() {

					$scope.nuevoEstudiante = $scope.nuevaPersona;
					$scope.nuevoEstudiante.idColegio = 1;
					$scope.nuevoEstudiante.idGrado = 1;
					$scope.nuevoEstudiante.acudiente = $scope.nuevoAcudiente;
					console.log($scope.nuevoEstudiante);
					epLoading(Coordinador.newEstudiante({}, $scope.nuevoEstudiante,
							function(estudiante) {
								$scope.resultados = [ estudiante ];
								$scope.search = estudiante.nombreCompleto;
								$scope.nuevaPersona = {};
								$scope.nuevoAcudiente = {};
								epModal.close('nuevo-estudiante');
								$scope.mostrarMatricula(estudiante);
							}), "[modal-id='nuevo-estudiante'] button.btn-aceptar");

				};
				$scope.cursos = Coordinador.getCursosGrado({
					idGrado : -1
				});
				$scope.cargarArchivoEstudiantes = function() {
					$scope.uploadFile = function() {
						var fd = new FormData();
						fd.append('file', $scope.archivoEstudiantes);
						$http.post("/api/coordinador/cargarArchivoEstudiantes", fd, {
							transformRequest : angular.identity,
							headers : {
								'Content-Type' : undefined
							}
						});
					}
				}
				$scope.mostrarEstudiante = function(estu) {
					$scope.$broadcast("$showEstudiante", estu);
				}
				$scope.mostrarMatricula = function(estu) {
					$scope.$broadcast("$showMatricula", estu);
				}
				$scope.notify = function() {
					epModal.notify("Ohh yeah!!", "error");
				}
				
				$scope.buscadorPersona = function(documento, callback){
					console.log(documento);
					ColegioInfo.getPersonasConDocumento({documento:documento}, function(data){
						callback(data);
					})
				}
			});

			app.controller('AdminEstudianteCtrl', function($scope, epModal,
					Coordinador) {
				$scope.estudiante = {};
				function setEstudiante(e, estu) {
					$scope.estudiante = estu;

				}
				;
				$scope.$on("$showEstudiante", function(e, estu) {
					setEstudiante(e, estu);
					$scope.pane = "estudiante";
					epModal.open("estudiante");
				});
				$scope.$on("$showMatricula", function(e, estu) {
					setEstudiante(e, estu);
					epModal.open("matricula");
				});
				$scope.matricular = function() {

					var matricula = angular.copy($scope.estudiante.matricula);
					matricula.idEstudiante = $scope.estudiante.id;
					//@Check Coordinador.newMatricula(['idColegio','idGrado'])
					Coordinador.newMatricula(matricula, function() {
						epModal.close("matricula");
					});
				};
				$scope.actualizarPersona = function() {
					var estudiante = angular.copy($scope.estudiante);

					Coordinador.updateEstudiante({
						idEstudiante : $scope.estudiante.id
					}, estudiante, function() {
						epModal.close("estudiante");
					});
				};
			});

			app.controller("AdminCursosCtrl", function($scope, Coordinador, $window,
					$state, epLoading) {
				var gradosMap = {};
				$scope.grados = Coordinador.getGrados({}, function(data) {
					for ( var i = 0; i < $scope.grados.length; i++) {
						$scope.grados[i].cursos = Coordinador.getCursosGrado({
							idGrado : $scope.grados[i].id
						});
						gradosMap[$scope.grados[i].id] = $scope.grados[i];
					}
				});

				$scope.agregarCurso = function(grado) {
					// FIXME Bloquear las acciones del usuario hasta que
					// responsa el
					// servidor
					var prefix = grado.id;
					if (!grado.cursos)
						grado.cursos = [];

					prefix = prefix + "";
					var suffix = grado.cursos.length + 1;
					suffix = suffix + "";
					if (suffix.length < 2)
						suffix = "0" + suffix;
					var curso = {};
					curso.nombre = prefix + suffix;
					curso.idGrado = grado.id;
					epLoading(Coordinador.newCurso({}, curso, function(data) {
						grado.cursos.push(data);
					}), "#divGrado" + grado.id);
				};

				$scope.borrarCurso = function(item) {
					Coordinador.deleteCurso({
						idCurso : item.id
					}, {}, function() {
						gradosMap[item.idGrado].cursos.splice((function(cursos, id) {
							for ( var i = 0; i < cursos.length; i++)
								if (cursos[i].id == id)
									return i;
						})(gradosMap[item.idGrado].cursos, item.id), 1);
					}, function(error) {
						$window.alert(error.data);
					});
				}
				$scope.mostrar = function(curso) {
					$state.transitionTo("admin.curso", {
						idCurso : curso.id
					});
				}
			});
			app.controller("AdminCursoCtrl", function($scope, $stateParams,
					Coordinador, epLoading, epCache, epChanging) {
				var materiasMap = {};
				$scope.curso = Coordinador.getCurso({
					idCurso : $stateParams.idCurso
				}, function() {
					Coordinador.getMaterias({}, {}, function(materias) {
						materiasMap = _.indexBy(materias, 'id');
						$scope.materiasCurso = Coordinador.getMateriasCurso({
							idCurso : $stateParams.idCurso
						}, function(materiasCurso) {
							materiasCurso.forEach(function(materiaCurso) {
								materiaCurso.materia = materiasMap[materiaCurso.idMateria];
							});
						});
					});
				});

				$scope.profesores = Coordinador.getProfesores();

				$scope.cambiarNombre = function() {
					epChanging($scope, 1300, function() {
						epLoading(Coordinador.updateCurso({
							idCurso : $scope.curso.id
						}, $scope.curso, function() {
						}), "#divNombreCurso")
					});
				}

				$scope.asignarProfesor = function(profesor, materiaCurso) {

					var mc = angular.copy(materiaCurso);
					delete mc.materia;
					delete mc.profesor;
					mc.profesor = profesor;
					epLoading(Coordinador.updateMateriaCurso({
						idMateria : mc.idMateria,
						idCurso : $scope.curso.ud
					}, mc, function() {
						materiaCurso.profesor = profesor;
					}), "#li-" + mc.idMateria);
				}
			});

			app.controller("AdminMateriasCtrl",
					function($scope, epCache, Coordinador) {

					});

			app
					.controller(
							"AdminCalendarioCtrl",
							function($scope, $window, Coordinador, epLoading) {
								$scope.calendario = Coordinador
										.getCalendarioAcademicoActual(function(data) {
										});
								$scope.actualizarFechasCalendario = function() {
									if ($scope.calendario.numPeriodos > 0) {
										$scope.calendario.periodos[0].fechaInicio = $scope.calendario.fechaInicio;
										$scope.calendario.periodos[$scope.calendario.numPeriodos - 1].fechaFin = $scope.calendario.fechaFin;
									}
								}

								$scope.actualizarPeriodos = function() {
									$window.scope = $scope;
									$scope.calendario.periodos = [];
									for ( var i = 0; i < $scope.calendario.numPeriodos; i++)
										$scope.calendario.periodos.push({});
									$scope.actualizarFechasCalendario();
								}
								$scope.inicioPeriodoActualizado = function($index, fechaInicio) {
									var periodo = $scope.calendario.periodos[$index];
									if ($index == 0) {
										$scope.calendario.fechaInicio = periodo.fechaInicio;
									} else
										$scope.calendario.periodos[$index - 1].fechaFin = periodo.fechaInicio;
								}

								$scope.finPeriodoActualizado = function($index, fechaFin) {
									var periodo = $scope.calendario.periodos[$index];
									if ($index == $scope.calendario.numPeriodos - 1) {
										$scope.calendario.fechaFin = periodo.fechaFin;
										console.log(periodo.fechaFin);

										$window.f = periodo.fechaFin;
									} else
										$scope.calendario.periodos[$index + 1].fechaInicio = periodo.fechaFin;

								}

								$scope.guardar = function() {
									epLoading(Coordinador.updateCalendarioAcademico({
										idCalendarioAcademico : $scope.calendario.id
									}, $scope.calendario), "#form");
								};
							});

			app.controller("UsersUsersCtrl", function($scope, $state, Coordinador,
					epModal) {
				window.epModal = epModal;
				var crearUsuario = {
					"users.secretarios" : Coordinador.newSecretario,
					"users.profesores" : Coordinador.newProfesor
				}[$state.current.name];
				var cargarUsuarios = {
					"users.secretarios" : Coordinador.getSecretarios,
					"users.profesores" : Coordinador.getProfesores
				}[$state.current.name];

				$scope.colUsers = cargarUsuarios();

				$scope.nuevoUsuario = {}

				$scope.crearUsuario = function() {

					var nuevoUsuario = $scope.nuevoUsuario;
					var colUsers = $scope.colUsers;
					nuevoUsuario = crearUsuario({}, nuevoUsuario, function() {
						colUsers.push(nuevoUsuario);
						epModal.close('nuevo-usuario');
					});

					$scope.nuevoUsuario = {};
				}

			});
			return app;
		});
